OpenGl中使用着色器的基本步骤及GLSL渲染简单示例 您所在的位置:网站首页 opengl 片元着色器 OpenGl中使用着色器的基本步骤及GLSL渲染简单示例

OpenGl中使用着色器的基本步骤及GLSL渲染简单示例

2023-04-29 10:11| 来源: 网络整理| 查看: 265

OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是在GPU上。GLSL使用类型限定符而不是通过读取和写入操作来管理输入和输出。着色器主要分为顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)两部分。

顶点着色器的主要功能是:

顶点法线变换及单位化纹理坐标变换光照参数生成

顶点着色器的输入内容包括:

着色器源代码attribute变量uniform变量

顶点着色器的输出内容包括:

varying变量内置的特殊变量,如gl_Position、gl_FrontFacing、gl_PointSize

片元着色器的主要功能:

在差值得到的值上进行操作访问纹理应用纹理雾化颜色融合片元着色器的输入内容包括: 着色器源代码用户自定义的varying变量uniform变量采样器(Sampler)一些内置的特殊变量(gl_PointCoord、gl_FragCoord、gl_FrontFacing等)片元着色器的输出: 内置的特殊变量gl_FragColor

在OpenGL程序中使用着色器的初始化一般需要依次执行以下步骤:

1、顶点着色程序的源代码和片段着色程序的源代码分别写入到一个文件里(或字符数组)里面,一般顶点着色器源码文件后缀为.vert,片段着色器源码文件后缀为.frag;2、使用glCreateshader()分别创建一个顶点着色器对象和一个片段着色器对象;3、使用glShaderSource()分别将顶点/片段着色程序的源代码字符数组绑定到顶点/片段着色器对象上;4、使用glCompileShader()分别编译顶点着色器和片段着色器对象(最好检查一下编译的成功与否);5、使用glCreaterProgram()创建一个着色程序对象;6、使用glAttachShader()将顶点和片段着色器对象附件到需要着色的程序对象上;7、使用glLinkProgram()分别将顶点和片段着色器和着色程序执行链接生成一个可执行程序(最好检查一下链接的成功与否);8、使用glUseProgram()将OpenGL渲染管道切换到着色器模式,并使用当前的着色器进行渲染;

以下是一个功能简单但流程完整的使用顶点着色器和片段着色器渲染的矩形图形。项目一共包含5个文件。2个资源文件(VertexShader.vert和FragmentShader.frag,分别是顶点着色器源码文件和片段着色器源码文件),2个cpp文件(Hello GLSL.cpp和Textfile.cpp),1个头文件Textfile.h。

VertexShader.vert文件内容:

//定义GLSL版本 #version 440 in vec4 VertexPosition; in vec4 VertexColor; out vec4 Color; void main() { Color =VertexColor; gl_Position = VertexPosition; }

FragmentShader.frag文件内容:

#version 440 in vec4 Color; //汉字用于测试汉字是否可用,有报着色器源码注释含汉字运行报错的 out vec4 FragColor; void main() { FragColor = Color; }

Hello GLSL.cpp文件内容:

#include #include "Textfile.h" #include #include #pragma comment(lib,"glew32.lib") using namespace std; GLuint vShader, fShader;//顶点/片段着色器对象 GLuint vaoHandle;// VAO对象 //顶点位置数组 float positionData[] = { -0.5f,-0.5f,0.0f,1.0f, 0.5f,-0.5f,0.0f,1.0f, 0.5f,0.5f,0.0f,1.0f, -0.5f,0.5f,0.0f,1.0f }; //顶点颜色数组 float colorData[] = { 1.0f, 0.0f, 0.0f,1.0f, 0.0f, 1.0f, 0.0f,1.0f, 0.0f, 0.0f, 1.0f,1.0f, 1.0f,1.0f,0.0f,1.0f }; void initShader(const char *VShaderFile, const char *FShaderFile) { //1、查看显卡、GLSL和OpenGL的信息 const GLubyte *vendor = glGetString(GL_VENDOR); const GLubyte *renderer = glGetString(GL_RENDERER); const GLubyte *version = glGetString(GL_VERSION); const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有